package controller;

import dao.ItemJpaController;
import dao.QuestaoJpaController;
import dao.QuestaoProfessorJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import model.Item;
import model.Questao;
import model.QuestaoProfessor;
import model.TipoQuestao;
import pagecontroller.JsfUtil;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 * @SM
 */
public class QuestaoController extends Controller {

    public QuestaoController() {
        if (JsfUtil.getObjectFromSession("QuestaoJpaController") == null) {
            jpaController = new QuestaoJpaController();
        } else {
            jpaController = (QuestaoJpaController) JsfUtil.getObjectFromSession("QuestaoJpaController");
        }
    }
    private Questao questao = null;
    private Questao questaoAux = null;
    private QuestaoJpaController jpaController = null;
    private List<Questao> questaos = null;
    private Item item = null;
    private List<Item> itens = null;
    private QuestaoProfessor questaoProfessor;
    private int indexItem;
    private String stringPesquisa;
    private List<Questao> questaosPesquisa = null;
    

    public void clear() {
        questao = null;
        questaos = null;
        item = null;
        itens = null;
        questaoProfessor = null;
    }

    public String setPageQuestaoCad() {
        clear();
        getPageManager().setPageQuestaoCad();
        return "refreshPage";
    }

    public Item getItem() {
        if (item == null) {
            item = new Item();
        }
        return item;
    }

    public List<Item> getItens() {
        itens = getQuestao().getItems();
        if (itens == null) {
            itens = new ArrayList<Item>();
            questao.setItems(itens);
        }
        return getQuestao().getItems();
    }

    public String persiste() {
        if (questao.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {

            for (Item itemBanco : getItemController().getItems(questao)) {
                if (!itemContemNaLista(itemBanco)) {
                    getItemController().getJpaController().destroy(itemBanco.getId());
                }
            }


            for (Item item : getItens()) {
                item.setQuestao(getQuestao());

                if (item.getId() == null) {
                    getItemController().getJpaController().create(item);
                } else {
                    getItemController().getJpaController().edit(item);
                }
            }

            jpaController.edit(this.questao);
            JsfUtil.setObjectFromSession("QuestaoTemp", questao);
            questaoAux = questao;
            questao = null;
            JsfUtil.addSuccessMessage("Questao Atualizada com sucesso.");
            getPageManager().setPageQuestaoWorkspaceCad();

        } catch (NonexistentEntityException ex) {
            Logger.getLogger(QuestaoController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(QuestaoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {
        ItemJpaController itemJpaController = (ItemJpaController) JsfUtil.getObjectFromSession("ItemJpaController");
        if (itemJpaController == null) {
            itemJpaController = new ItemJpaController();
        }

        try {
            UsuarioController usuarioController = (UsuarioController) JsfUtil.getObjectFromSession("UsuarioController");

            //persiste a questao
            questao.setProfessor(usuarioController.getUsuarioLogado().getProfessor());



            //persiste cada item de uma questao
            for (Item i : questao.getItems()) {
                i.setQuestao(questao);
//                itemJpaController.create(i);
            }

            jpaController.create(questao);

            //associarQuestaoProfessor();

            JsfUtil.setObjectFromSession("QuestaoTemp", questao);

            questaoAux = questao;
            questao = null;
            JsfUtil.addSuccessMessage("Questao cadastrado com sucesso.");
            getPageManager().setPageQuestaoWorkspaceCad();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        Questao questaoTemp = (Questao) JsfUtil.getObjectFromRequestParameter("questaoTemp");
        this.questao = questaoTemp;
        return "refreshPage";
    }
    
    
    public String load() {
        questaoAux = (Questao) JsfUtil.getObjectFromRequestParameter("questaoTemp");
        JsfUtil.setObjectFromSession("questaoTemp", questaoAux);
        getPageManager().setModalQuestaoRelat();
        return "refreshPage";
    }
    
    

    public String load(Questao q) {
        questaoAux = q;
        getPageManager().setPageQuestaoRelat();
        return "refreshPage";
    }

    public String destroy() {
        Questao questaoTemp = (Questao) JsfUtil.getObjectFromRequestParameter("questao");
        try {
            jpaController.destroy(questaoTemp.getId());
            JsfUtil.addSuccessMessage("Questao removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(QuestaoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public String editButton() {
        this.questao = questaoAux;
        getPageManager().setPageQuestaoCad();

        return "refreshPage";
    }

    public String destroyButton() {
        Questao questaoTemp = questaoAux;
        try {
            jpaController.destroy(questaoTemp.getId());
            JsfUtil.addSuccessMessage("Questao removida com sucesso.");
            questaoAux = null;

        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public Questao getQuestao() {

        if (questao == null) {
            UsuarioController usuarioController = (UsuarioController) JsfUtil.getObjectFromSession("UsuarioController");
            questao = new Questao();
            questao.setAutor(usuarioController.getUsuarioLogado().getProfessor().getNome());
        }
        return questao;
    }

    public List<Questao> getQuestaos() {
        this.questaos = jpaController.findQuestaoEntities();
        for(Questao q:questaos){
            q.getItems();
        }
        
        
        return this.questaos;
    }

    public QuestaoJpaController getJpaController() {
        return jpaController;
    }

    public Questao getQuestaoAux() {
        if (questaoAux == null) {
            questaoAux = getQuestao();
        }
        return questaoAux;
    }

    public List<TipoQuestao> getTiposQuestoes() {
        return TipoQuestao.getList();
    }

    private void associarQuestaoProfessor() {

        UsuarioController usuarioController = (UsuarioController) JsfUtil.getObjectFromSession("UsuarioController");
        //associa a questão ao professor
        QuestaoProfessorJpaController questaoProfessorJpaController = (QuestaoProfessorJpaController) JsfUtil.getObjectFromSession("QuestaoProfessorJpaController");
        if (questaoProfessorJpaController == null) {
            questaoProfessorJpaController = new QuestaoProfessorJpaController();
        }
        QuestaoProfessor questaoProfessor = new QuestaoProfessor();
        questaoProfessor.setProfessor(usuarioController.getUsuarioLogado().getProfessor());
        questaoProfessor.setQuestao(questao);
        questaoProfessorJpaController.create(questaoProfessor);
    }

    public QuestaoProfessor getQuestaoProfessor() {
        if (questaoProfessor == null) {
            questaoProfessor = new QuestaoProfessor();
        }
        return questaoProfessor;
    }

    public void setQuestaoProfessor(QuestaoProfessor questaoProfessor) {
        this.questaoProfessor = questaoProfessor;
    }

    public int getNumeroQuestoes() {
        return jpaController.findQuestaoEntities().size();
    }

    public String addQuestao() {
        questaoAux = (Questao) JsfUtil.getObjectFromRequestParameter("questaoTemp");
        JsfUtil.setObjectFromSession("QuestaoTemp", questaoAux);
        questao = null;
        getPageManager().setPageQuestaoWorkspaceCad();
        return "refreshPage";
    }

    public String questaoView() {
        questaoAux = (Questao) JsfUtil.getObjectFromRequestParameter("questaoTemp");
        JsfUtil.setObjectFromSession("QuestaoTemp", questaoAux);
        getPageManager().setModalQuestaoRelat();
        return "refreshPage";
    }

    public void editItem() {
        item = (Item) JsfUtil.getObjectFromRequestParameter("itemTemp");
        for (int i = 0; i < itens.size(); i++) {
            Item item2 = getItens().get(i);
            if (item2 == item) {
                indexItem = i;
                break;
            }
        }





        getPageManager().setModalItemCad();
    }

    public String removeItem() {
        item = (Item) JsfUtil.getObjectFromRequestParameter("itemTemp");
        for (int i = 0; i < itens.size(); i++) {
            Item item2 = getItens().get(i);
            if (item2 == item) {
                getItens().remove(i);
                break;
            }
        }
        item = null;
        return "refreshPage";
    }

    public String addItem() {
        if (indexItem == 0) {
            item.setQuestao(questao);
            getQuestao().getItems().add(item);

        }
        getPageManager().setModalVisible(false);
        this.item = null;
        indexItem = 0;

        return "refreshPage";

    }

//
//    public String RemoverItem() {
//        ItemDiploma itemdiploma = (ItemDiploma) JsfUtil.getObjectFromRequestParameter("itemDiplomaAux");
//        ItemDiplomaJpaController itemdiplomaJpaController = new ItemDiplomaJpaController();
//        try {
//            itemsDiplomas.remove(itemdiploma);
//            if (diploma.getId() != null && diploma.getId() != 0) {
//                itemdiplomaJpaController.destroy(itemdiploma.getId());
//            }
//        } catch (NonexistentEntityException ex) {
//            Logger.getLogger(DiplomaController.class.getName()).log(Level.SEVERE, null, ex);
//        }
//
//        return "refreshPage";
//    }
    private boolean itemContemNaLista(Item item) {
        if (getQuestao().getItems().contains(item)) {
            return true;
        }
        return false;
    }

    public String getStringPesquisa() {
        return stringPesquisa;
    }

    public void setStringPesquisa(String stringPesquisa) {
        this.stringPesquisa = stringPesquisa;
    }

    public List<Questao> getQuestaosPesquisa() {
        if (questaosPesquisa == null) {
            questaosPesquisa = new ArrayList<Questao>();
        }
        return questaosPesquisa;
    }

    public void setQuestaosPesquisa(List<Questao> questaosPesquisa) {
        this.questaosPesquisa = questaosPesquisa;
    }

    public void pesquisar() {
        setQuestaosPesquisa(jpaController.findQuestao(getStringPesquisa()));
    }
}
